public int maxRecSize(int[][] map){
    if(map==0||map.length==0||map[0].length==0){
        return 0;
    }

    int maxArea=0;
    int[] height=new int[map[0].length];
    for(int i=0;i<map.length;i++){
        for(int j=0;j<map[0].length;j++){
            height[j]=map[i][j]==0?0:height[j]+1;
        }
        maxArea=Math.max(maxRecFromBotton(height),maxArea);
    }
    return maxArea;
}

public int maxRecFromBotton(int[] height){
    if(height.length==null||height.length==0){
        return 0;
    }
    int maxArea=0;
    Stack<Integer> stack=new Stack<>();
    for(int i=0;i<height.length;i++){
         while(!stack.isEmpty()&&height[stack.peek()]>height[i]){
             int popIs=stack.pop();
             int k=stack.isEmpty?-1:stack.peek();
             int curArea=(popIs-k-1)*height[popIs];
             maxArea=Math.max(maxArea,curArea);

         }
         stack.push(i);
    }

    while(!stack.isEmpty()){
        int popIs=stack.pop();
        int k=stack.isEmpty?-1:stack.peek();
        int curArea=(height.length-k-1)*height[popIs];
        maxArea=Math.max(maxArea,curArea);
    }

 return maxArea;   
}